package com.newtouch.mark.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.newtouch.mark.exception.NotFileException;

/**
 * 查找java文件的注释行数
 * 注：要求符合Java编写规范
 *
 * @author 11710
 * @version 1.0.0 2012/04/19
 */
public class FileCommentCounter {
    private File file = null;

    /**
     * 初始化一个实例，file默认指定一个文件名.
     *
     * @param file 文件名
     */
    public FileCommentCounter(File file) {
        init(file);
    }

    /**
     * 返回该Java文件的注释行和非注释行数 Map中的Key有： whileLine 空白行 textLine 文本注释 doubleLine
     * 双斜杠注释 normalLine 非注释行
     *
     * @return 文件的注释行和非注释行数
     */
    public Map<String, Integer> getCommentLines() throws IOException {
        Map<String, Integer> map = new HashMap<String, Integer>();
        int whileLine = 0; // 记录空白行数量
        int textLine = 0; // 记录文本注释数量
        int doubleLine = 0; // 记录双斜杠注释数量
        int normalLine = 0; // 记录非注释行数量
        boolean comment = false;
        FileReader fr = null;
        BufferedReader reader = null;
        try {
            fr = new FileReader(file);
            reader = new BufferedReader(fr);
            String temp = null;
            while ((temp = reader.readLine()) != null) {
                // 匹配空白行
                if (temp.matches("\\s*")) {
                    whileLine++;

                } else if (temp.matches("[\\s]*/\\*.*")) {
                    // 匹配文本注释
                    textLine++;
                    comment = true;
                    // 单行文本注释
                    if (temp.matches(".*\\*/.*")) {
                        comment = false;
                    }
                } else if (comment) {
                    // 多行文本注释
                    textLine++;
                    if (temp.matches(".*\\*/.*")) {
                        comment = false;
                    }
                } else if (temp.matches("\\s*//.*")) {
                    // 双斜杠注释
                    doubleLine++;
                } else {
                    normalLine++;
                }
            }
        } catch (FileNotFoundException e) {
            // 初始化实例时已经做了
        } finally {
            if (fr != null) {
                fr.close();
            }
            if (reader != null) {
                reader.close();
            }
        }

        map.put("whileLine", whileLine);
        map.put("textLine", textLine);
        map.put("doubleLine", doubleLine);
        map.put("normalLine", normalLine);
        return map;
    }

    /**
     * 设置一个文件名从而读取该文件的注释
     * @param file 文件名
     */
    public void setFile(File file) {
        init(file);
    }

    /**
     * 初始化
     *
     * @param file 文件名
     */
    private void init(File file) {
        if (file == null || !file.isFile()) {
            throw new NotFileException("The file is not file type or is null");
        }
        this.file = file;
    }

}